package ufr_stgi.assistance_conduite;

import ufr_stgi.assistance_conduite.synchronisation.*;

import android.app.*;
import android.content.*;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.*;
import android.widget.*;

/**
 * Activité principale qui est lancé au démarrage de l'application
 * @author Guillaume MONTAVON & Renaud DAVID (Master 2 RIM)
 */
public class MainActivity extends Activity {
	
	private MonApplication appli; //application
	
	private TextView caracteristique;
	private TextView position;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.i(this.getClass().getName(), "onCreate");
		
		setContentView(R.layout.main);
		
		appli = (MonApplication)getApplication();
		appli.setMain(this);
		appli.setActivityCourante(this);
		
		Button boutonRP = (Button) findViewById(R.id.bouton_rp);
		Button boutonSynchro = (Button) findViewById(R.id.bouton_tout_synchro);
		caracteristique = (TextView) findViewById(R.id.caracteristique);
		position = (TextView) findViewById(R.id.position);
		
		boutonRP.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(appli.getMain(), ReconnaissancePanneaux.class);
				startActivityForResult(intent, MonApplication.CODE_ACTIVITY_RP);
				transitionActivity();
			}
		});
		
		boutonSynchro.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Synchronisation toutSynchro = new Synchronisation(appli, Synchronisation.ACTION_TOUT_SYNCHRONISER);
				toutSynchro.start();
				
				Intent intentUploadPanneaux = new Intent(appli, UploaderPanneaux.class);
				startService(intentUploadPanneaux);
			}
		});
		
		
		
		//appli.getLocManager().isProviderEnabled(LocationManager.GPS_PROVIDER);
		appli.getLocManager().requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, appli.getGps());
		setProgressBarIndeterminateVisibility(true);
		
		//affiche un message si c'est la première fois qu'on lance l'application
		appli.afficherMessageBienvenu();
		
		if(appli.isPremierLancement()) {
			appli.setPremierLancement(false);
			Synchronisation type_panneaux = new Synchronisation(appli, Synchronisation.ACTION_MAJ_TYPE_PANNEAU);
			type_panneaux.start();
		}
			
		MAJCaracteristiques();
		MAJPosition();
	}
	
	
	@Override
	protected void onResume() {
		super.onResume();
		Log.i(this.getClass().getSimpleName(), "onResume");
	}
	
	@Override
	protected void onStop() {
		Log.i(this.getClass().getSimpleName(), "onStop");
		super.onStop();
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.i(this.getClass().getSimpleName(), "onDestroy");
		appli.getLocManager().removeUpdates(appli.getGps());
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		Log.i(this.getClass().getSimpleName(), "onPause");
	}
	
	@Override
	protected void onStart() {
		super.onStart();
		Log.i(this.getClass().getSimpleName(), "onStart");
	}
	
	
	/**
	 * Permet de générer une transition lorsqu'on lance une nouvelle activity
	 */
	public void transitionActivity() {
		overridePendingTransition(R.anim.zoom_enter,R.anim.zoom_exit);  
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data){
		
		switch(requestCode){
			case MonApplication.CODE_PREF_GPS:
				if (!appli.getLocManager().isProviderEnabled(LocationManager.GPS_PROVIDER))
					 appli.createGpsDisabledAlert();
				break;
			case MonApplication.CODE_ACTIVITY_AC:
				appli.setActivityCourante(this);
				break;
			case MonApplication.CODE_ACTIVITY_RP:
				appli.setActivityCourante(this);
				break;
			default :
				break;
		}
	
	}
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu){
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.main_menu, menu);
		
		return true;
	}
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			//on modifie les préférences
			case R.id.menu_reglage:
				Intent intentPrefs = new Intent(appli.getMain(), Preferences.class);
				startActivityForResult(intentPrefs, MonApplication.CODE_PREFS_MENU);
				transitionActivity();
				return true;
				
			case R.id.menu_liste_panneaux:
				Intent intent = new Intent(appli.getMain(), ListePanneau.class);
				startActivityForResult(intent, MonApplication.CODE_ACTIVITY_LISTE_PANNEAUX);
				transitionActivity();
				return true;
				
			case R.id.menu_a_propos:
				Dialog about = new Dialog(this);
				about.setContentView(R.layout.about_dialog);
				about.setTitle(R.string.menu_apropos);
				about.show();
				return true;
			
			//on choisi de synchroniser
			case R.id.menu_synchronisation:
				item.getSubMenu().setGroupVisible(R.id.groupe_synchronisation, true);
				if(appli.isEnCoursSynchro()) {
					item.getSubMenu().setGroupVisible(R.id.groupe_synchronisation, false);
					Toast.makeText(this, R.string.attente_synchronisation, Toast.LENGTH_SHORT).show();
					return false;
				}
				else
					return true;
			case R.id.sous_menu_synchronisation_envoi_panneaux:
				Intent intentUploadPanneaux = new Intent(this, UploaderPanneaux.class); 
				startService(intentUploadPanneaux);
				return true;
			case R.id.sous_menu_synchronisation_maj_panneaux:
				Synchronisation maj_panneaux = new Synchronisation(appli, Synchronisation.ACTION_MAJ_PANNEAU);
				maj_panneaux.start();
				return true;
			case R.id.sous_menu_synchronisation_import_gpx:
				final EditText nomFichier = new EditText(this);
				new AlertDialog.Builder(this)
				.setTitle(R.string.synchro_import_gpx)
				.setMessage(R.string.nom_fichier_gpx)
				.setView(nomFichier)
				.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						Synchronisation import_gpx = new Synchronisation(appli, Synchronisation.ACTION_IMPORTER_PANNEAU_GPX, nomFichier.getText().toString());
						import_gpx.start();
					}
				}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {}
				}).show();
				
				return true;
			case R.id.sous_menu_synchronisation_type_panneaux:
				Synchronisation type_panneaux = new Synchronisation(appli, Synchronisation.ACTION_MAJ_TYPE_PANNEAU);
				type_panneaux.start();
				return true;
			case R.id.sous_menu_synchronisation_images_panneaux:
				Synchronisation images_panneaux = new Synchronisation(appli, Synchronisation.ACTION_MAJ_IMAGES_PANNEAU);
				images_panneaux.start();
				return true;
				
			default:
				return super.onOptionsItemSelected(item);
		}
	}
	
	/**
	 * Met à jour à l'écran les caractéristiques des panneaux que le téléphone connaît
	 */
	public void MAJCaracteristiques() {
		
		String texte = "Panneaux connus : " + appli.getBdd().getListePanneau(true, appli.getLatitude(), appli.getLongitude()).size() + "\n";
		texte += "Panneaux à proximité : " + appli.getBdd().getListePanneau(false, appli.getLatitude(), appli.getLongitude()).size() + "\n";
		texte += "Panneaux sans images : " + appli.getBdd().getListeImageManquante().size() + "\n";
		texte += "Panneaux à envoyer : " + appli.getBdd().getListePanneauTemp().size() + "\n";
		texte += "Types de panneau : " + appli.getBdd().getListeType().size() + "\n";
		
		caracteristique.setText(texte);
		
	}
	
	/**
	 * Met à jour à l'écran la position, la vitesse et la direction du Smartphone
	 */
	public void MAJPosition() {
		String texte = "Position : \n";
		if(appli.getLatitude() == 0.0 && appli.getLongitude() == 0.0)
			texte += "Recherche du signal ... \n";
		else
			
		texte += "Lat : " + appli.getLatitude() + "\n";
		texte += "Long : " + appli.getLongitude() + "\n";
		texte += "Vitesse : " + Math.round(appli.getVitesse() * 3.6) + " km/h\n";
		texte += "Direction : ";
		
		switch (appli.getDirection()) {
			case 0:
				texte += "IMMOBILE";
				break;
			case 1:
				texte += "NORD";
				break;
			case 2:
				texte += "EST";
				break;
			case 3:
				texte += "SUD";
				break;
			case 4:
				texte += "OUEST";
				break;
			default:
				texte += "IMMOBILE";
				break;
		}
		texte += "\n";
		
		position.setText(texte);
		
	}
	
	/**
	 * Affiche une boite de dialogue pour dire qu'il faut attendre la fin de la synchronisation
	 */
	public void attenteSynchronisation() {
		new ErreurDialog(R.string.menu_synchronisation, R.string.attente_synchronisation, this);
	}
	
}
